#include <iostream>
#include <string>
#include <pthread.h>
#include <unistd.h>

using namespace std;

void *threadRoutine(void* args)
{
    const string name = (char*)args;
    //* data = new int[5];
    int count = 4;
    while(true)
    {
        //data[count] = count;
        cout << "i am a " << name << " running.." << endl;
        sleep(1); 
        //一个线程出现异常，整个进程就退出，本质是共用一个存储异常的寄存器
        // int a = 10;
        // a /= 0;
        if(!count--)
            break;
    }
    //pthread_cancel(pthread_self()); //不推荐
    //exit(1); //不要调用exit，exit是终止进程的，主线程的其他也没完成就惨遭殉情
    //pthread_exit((void*)55); //可以终止进程并返回一个void* (和return一样)
    //cout << "新线程退出咯..." << endl;
    //return (void*)data;
}

int main()
{
    pthread_t tid; //本质上是一个地址！

    pthread_create(&tid,nullptr,threadRoutine,(void*)"thread");
    
    while(1)
    {
        cout << "i am a main thread running..." << endl;
        sleep(2);
        break;
    }
    pthread_detach(tid);

    //线程在创建并执行的时候，线程也是需要被等待的，如果主进程不等待，会引起类似进程的僵尸问题，否则会导致内存泄漏
    //pthread_join(tid,nullptr); //阻塞的等待中
    int* tmp = nullptr;
    pthread_join(tid,(void**)&tmp); // 可以接收返回值,线程等待不需要关心线程的异常
    // for(int i = 0;i < 5;i++)
    // {
    //     cout << "接收到新线程退出，返回值为:" << tmp[i] << endl;
    // }
    cout << "接收到新线程退出，返回值为:" << (long long)tmp << endl;
    
    return 0;
}